import requests
import json
from bs4 import BeautifulSoup
import time
import re


class Item(object):

    """豆瓣读书 通过isbn搜书"""
    def __init__(self,isbn):
        """
        爬取目标
        1.书名
        2.作者
        3.出版社/出版公司
        4.出版时间
        5.评分
        6.评价人数
        7.书本价格
        8.书本URL
        9.书本图片
        10.书本所有用户评论
        -------------------
        作者：Fan Li
        to: Jingwei Liu
        时间：2020年11月28日 19:47:47
        项目名：豆瓣读书搜书小助手
        """
        """初始化"""
        self.isbn=isbn
        self.url='http://book.feelyou.top/isbn/'+self.isbn
        #设置请求头
        self.headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
        }

    def get_url(self):
        """构造URL"""
        url_list=[self.url]
        return url_list

    def get_html(self,url):
        """对相应网站发起get请求"""
        response=requests.get(url=url,headers=self.headers)
        return response.content.decode()

    def get_data_content(self,response):
        """获取详情页的书本信息"""
        soup=BeautifulSoup(response,'lxml')
        try:
            book_title=soup.select_one('h1 span').text#书名
            score=soup.select_one('strong.ll.rating_num').text#评分
            assess=soup.select_one('div.rating_sum a').text#评价人数

            """数据清洗"""
            company=re.findall('<span class="pl">出版社:</span> (.*?)<br/>',response)[0]#出版社/公司
            year=re.findall('<span class="pl">出版年:</span>(.*?)<br/>',response)[0]#出版时间
            page=re.findall('<span class="pl">页数:</span>(.*?)<br/>',response)[0]#总页数
            price=re.findall('<span class="pl">定价:</span>(.*?)<br/',response)[0]#价格
            isbn=re.findall('<span class="pl">ISBN:</span>(.*?)<br/>',response)[0]#isbn码
            content_info=soup.select('div.intro p')
            print('书本和作者相关信息：\n')
            for c in content_info:
                print('-'*100)
                print(c.text)
            print('出版社/公司名：{} 出版时间：{} 本书一共:{}页 价格：{} ISBN码：{}'.format(company,year,page,price,isbn))
            print('书名：{} 评分：{} 评价人数：{}'.format(book_title,score,assess))
            data=soup.select('#info')
            for d in data:
                author=d.select_one('span a').text#作者
                print('作者：{}'.format(author))
        except:
            pass

    def get_data(self,response):
        """获取书本的URL链接"""
        response=json.loads(response)
        urls=response['url']
        response=requests.get(url=urls,headers=self.headers)
        self.get_data_content(response.text)
        news_url=urls
        news_url=[news_url+'blockquotes?sort=score&start={}'.format(i)for i in range(0,40,20)] #构造评论的URL
        response=requests.get(news_url[0],headers=self.headers)
        soup=BeautifulSoup(response.text,'lxml')
        content=soup.select('div.blockquote-list.score.bottom-line ul li')
        try:
            for c in content:
                use_content=c.select_one('figure').text.strip()#获取用户评论相关信息
                print('用户评论：{}'.format(use_content))
        except:
            pass

    def get_save(self,get_data):
        """保存爬虫数据"""
        return get_data

    def run(self):
        """运行爬虫程序"""
        url_data=self.get_url()
        for url in url_data: #遍历URL
            response=self.get_html(url)
            data=self.get_data(response)
            self.get_save(data)


def main():
    #主函数
    s=time.time()
    item=Item('9787506365437')
    item.run()
    print('运行消耗时间：',time.time()-s)


if __name__ == '__main__':
    main()